<?php

namespace App\Http\Controllers\Admin;

use App\Http\Config\ErrorCode;
use App\Library\Tools;
use App\Models\Admin\Configs;
use App\Models\Auth\AuthBase;
use Illuminate\Http\Request;
use DB;

class ConfigsController extends BaseController
{

	public function __construct(Request $request)
    {
        parent::__construct($request);
    }

    //站点信息
    public function index()
    {
    	$laravel = app();
    	$configModel = new Configs();
    	$con = $configModel->getConfigByID();
//        $data = Tools::curl("https://crmweb.netbcloud.com/admin/configs/other", "");
        $data = Tools::curl("https://crm.netbcloud.com/admin/configs/other", "");
        $data = json_decode($data,1);
    	$arr[] = array('con_name'=>'程序版本','con_value'=>'云运维管理系统 '.$con['version']);
    	$arr[] = $data["data"][0];unset($data["data"][0]);
    	$arr[] = array('con_name'=>'服务器IP地址','con_value'=>$_SERVER['SERVER_ADDR']);
    	$arr[] = array('con_name'=>'服务器域名','con_value'=>$_SERVER['SERVER_NAME']); 
    	$arr[] = array('con_name'=>'服务器端口','con_value'=>$_SERVER['SERVER_PORT']); 
    	$arr[] = array('con_name'=>'服务器版本','con_value'=>php_uname('s').php_uname('r')); 
    	$arr[] = array('con_name'=>'服务器操作系统','con_value'=>php_uname()); 
    	$arr[] = array('con_name'=>'PHP版本','con_value'=>phpversion()); 
    	$arr[] = array('con_name'=>'Laravel版本','con_value'=>$laravel::VERSION); 
    	$arr[] = array('con_name'=>'服务器当前时间 ','con_value'=>date("Y-m-d H:i:s")); 
    	$arr[] = array('con_name'=>'最大上传限制 ','con_value' => get_cfg_var ('upload_max_filesize') ? get_cfg_var ('upload_max_filesize'):'不允许');
    	$arr[] = array('con_name'=>'最大执行时间','con_value'=>get_cfg_var("max_execution_time")."秒 "); 
    	$arr[] = array('con_name'=>'数据库版本','con_value'=>'Mysql 5.7');
        $arr = array_merge($arr, $data["data"]);
        $this->returnData['data'] = $arr;
        return response()->json($this->returnData);
    }

    //站点信息
    public function other()
    {
    	$arr[] = array('con_name'=>'软件版本','con_value'=>'V2.0');
    	$arr[] = array('con_name'=>'联系我们','con_value'=>'手机/微信：13670093216 QQ：1018608475');
    	$arr[] = array('con_name'=>'版权所有','con_value'=>'深圳市网商天下科技开发有限公司');
    	$arr[] = array('con_name'=>'总策划兼项目经理','con_value'=>'车贯 （Michael）');
    	$arr[] = array('con_name'=>'研发团队','con_value'=>'陈元  许堉颖  陈镇松  李迪');
    	$arr[] = array('con_name'=>'设计团队','con_value'=>'龙芳 林鸿耿');
    	$arr[] = array('con_name'=>'特别支持','con_value'=>'刘远航  袁程远');
        $this->returnData['data'] = $arr;
        return response()->json($this->returnData);
    }

    /* 用户菜单 */
    public function UserMenu()
    {
        if($this->is_su){
            $res = AuthBase::getSuMenu();
        }else{
            $res = AuthBase::getUserPermission($this->AU['id']);
        }
        if(!$res){
            $this->returnData = ErrorCode::$admin_enum['fail'];
            return response()->json($this->returnData);
        }
        $this->returnData['data'] = ['menu'=>$res];
        return response()->json($this->returnData);
    }
    
    //更新版本
    public function ajax(Request $request)
    {
    	if($request->c == 'updateversion'){
            $configModel = new Configs();
            $con = $configModel->getConfigByID();
	    	//解除时间限制
	    	set_time_limit(0);
	    	ini_set('memory_limit', '128M');
	    	
	    	$res = $this->getVersion();
	    	$indexOf = array_search($con->version,$res);
	    	if($indexOf < (count($res)-1)){
	    		$filename = $res[$indexOf+1];
	    		
	    		//判断文件是否存在
	    		if(!file_exists(base_path('public/version').'/'.$filename.'.zip')){
	    			$bool = copy($this->url.'/'.$filename.'.zip',base_path('public/version').'/'.$filename.'.zip');
	    		}else{
	    			$bool = true;	
	    		}
	    		
	    		//解压文件
	    		$bool2 = $this->unzip(base_path('public/version').'/'.$filename.'.zip',base_path('./'), true, true);
	    		
	    		//读取SQL脚本
	    		if(file_exists(base_path('public/dbsql').'/db.txt')){
	    			$return = $this->readTxt(base_path('public/dbsql').'/db.txt');
	    			
	    			//开启事务
				    DB::beginTransaction();
			        try {
			        	foreach($return as $v){
		    				DB::statement($v);
		    			}
						
						DB::commit();
					} catch(\Illuminate\Database\QueryException $ex) {
			            DB::rollback(); //回滚事务
			            
			            $this->result['status'] = 1;
	    				$this->result['msg'] = '更新有误！！！请联系管理员！！！';
	    				return response()->json($this->result);
			        }
	    		}
	    		
	    		//更新版本信息
				$data_upd['version'] = $res[$indexOf+1];
				Configs::where('id','=',1)->update($data_upd);
	    		
	    		if(!$bool||!$bool2){
	    			$this->result['status'] = 1;
	    			$this->result['msg'] = '更新有误！！！请联系管理员！！！';
	    		}
	    	}else{
	    		$this->result['status'] = 1;
	    		$this->result['msg'] = '已经是最新版本了';
	    	}
	    	
	    	return response()->json($this->result);
    	}
    	
    	$this->result['status'] = 1;
	    $this->result['msg'] = '请求异常！！！';
	    return response()->json($this->result);	
    }
    
    /**
    * 解压文件到指定目录
    *
    * @param  string  zip压缩文件的路径
    * @param  string  解压文件的目的路径
    * @param  boolean 是否以压缩文件的名字创建目标文件夹
    * @param  boolean 是否重写已经存在的文件
    *
    * @return boolean 返回成功 或失败
    */
    private function unzip($src_file, $dest_dir=false, $create_zip_name_dir=true, $overwrite=true){
	    if($zip = zip_open($src_file)){
		    if($zip){
		        $splitter = ($create_zip_name_dir === true) ? "." : "/";
		        if($dest_dir === false){
		        	$dest_dir = substr($src_file, 0, strrpos($src_file, $splitter))."/";
		        }
		      	// 如果不存在 创建目标解压目录
		        $this->create_dirs($dest_dir);
		        // 对每个文件进行解压
		        while ($zip_entry = zip_read($zip)){
		            // 文件不在根目录
		            $pos_last_slash = strrpos(zip_entry_name($zip_entry), "/");
		            if ($pos_last_slash !== false){
			            // 创建目录 在末尾带 /
			            $this->create_dirs($dest_dir.substr(zip_entry_name($zip_entry), 0, $pos_last_slash+1));
			        }
		            // 打开包
		            if (zip_entry_open($zip,$zip_entry,"r")){
			            // 文件名保存在磁盘上
			            $file_name = $dest_dir.zip_entry_name($zip_entry);
			            $file_name = iconv("GBK", "UTF-8", $file_name);
			            // 检查文件是否需要重写
			            if ($overwrite === true || $overwrite === false && !is_file($file_name)){
			                // 读取压缩文件的内容
			                $fstream = zip_entry_read($zip_entry, zip_entry_filesize($zip_entry));
			                @file_put_contents($file_name, $fstream);
			                // 设置权限
			                chmod($file_name, 0777);
		                 }
			            // 关闭入口
			            zip_entry_close($zip_entry);
		            }
		        }
		        // 关闭压缩包
		        zip_close($zip);
		        
		        return true;
		    }else{
		    	return false;
		    }
	    }else{
	        return false;
	    }
	    return true;
	}
	
    /**
    * 创建目录
    */
    private function create_dirs($path){
	    if (!is_dir($path)){
	        $directory_path = "";
	        $directories = explode("/",$path);
	        array_pop($directories);
	        foreach($directories as $directory){
		        $directory_path .= $directory."/";
		        if (!is_dir($directory_path)){
			        mkdir($directory_path);
			        chmod($directory_path, 0777);
		        }
		    }
	    }
    }
    
    //读取txt文件
    private function readTxt($url){
    	$str=file_get_contents($url);
		$str_encoding = mb_convert_encoding($str, 'UTF-8', 'UTF-8,GBK,GB2312,BIG5');//转换字符集（编码）
		$arr = explode("\r\n", $str_encoding);//转换成数组
		$arr1=array();
		foreach($arr as $row){
			array_push($arr1,trim($row));
		}
		return $arr1;
    }
    
    //删除版本信息文件
    private function deldir($path){
    //如果是目录则继续
    	if(is_dir($path)){
    	//扫描一个文件夹内的所有文件夹和文件并返回数组
   			$p = scandir($path);
   			foreach($p as $val){
	    		//排除目录中的.和..
	    		if($val !="." && $val !=".."){
	     			//如果是目录则递归子目录，继续操作
	     			if(is_dir($path.$val)){
	      				//子目录中操作删除文件夹和文件
	      				$this->deldir($path.$val.'/');
	      				//目录清空后删除空文件夹
	      				@rmdir($path.$val.'/');
	     			}else{
	      				//如果是文件直接删除
	      				unlink($path.$val);
	     			}
	    		}
   			}
  		}
    }
    
    //获取版本信息
    private function getVersion(){
    	$str = file_get_contents($this->url.'/version.txt');
    	if(!$str){
    		return false;
    	}
		$str_encoding = mb_convert_encoding($str, 'UTF-8', 'UTF-8,GBK,GB2312,BIG5');//转换字符集（编码）
		$arr = explode("\r\n", $str_encoding);//转换成数组
		$arr1=array();
		foreach($arr as $row){
			array_push($arr1,trim($row));
		}
		return $arr1;
    }
}
